#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

// void handler(int signo)
// {
//     // 1. 我有非常多的子进程，在同一个时刻退出了
//     // waitpid(-1) -> while(1)
//     // 2. 我有非常多的子进程，在同一个时刻只有一部分退出了
//     // while(1)
//     // {
//     //     pid_t ret = waitpid(-1, NULL, WNOHANG);
//     //     if(ret == 0) break;
//     // }
//     // printf("pid: %d, %d 号信号，正在被捕捉!\n", getpid(), signo);
// }

void Count(int cnt)//子进程活的时间
{
    while (cnt)
    {
        printf("cnt: %2d\r", cnt);
        fflush(stdout);
        cnt--;
        sleep(1);
    }
    printf("\n");
}

int main()
{
    // 显示的设置对SIGCHLD进行忽略
    signal(SIGCHLD, SIG_IGN);
 

    printf("我是父进程, %d, ppid: %d\n", getpid(), getppid());

    pid_t id = fork();
    if (id == 0)
    {
        printf("我是子进程, %d, ppid: %d,我要退出啦\n", getpid(), getppid());
        Count(5);
        exit(1);
    }

    while (1)//父进程什么都不做，但是也不退出，等子进程给父进程发信号！
        sleep(1);
    return 0;
}

// #include <stdio.h>
// #include <signal.h>

// //volatile : 保持内存可见性！—— 每次读取数据都去内存读，而不是在寄存器中读取！
// volatile int quit = 0;

// void handler(int signo)
// {
//     printf("%d号信号正在被捕捉!",signo);
//     printf("quit : %d", quit);
//     quit = 1;
//     printf(" -> %d\n", quit);
// }
// int main()
// {
//     signal(2, handler);
//     while (!quit)
//         ;
//     printf("我是正常退出的！\n");
//     return 0;
// }